import {
  app,
  BrowserWindow,
  dialog,
  Tray,
  Menu,
  ipcMain,
  nativeTheme
} from 'electron'
import { fileURLToPath } from 'node:url'
import path from 'node:path'
import type { BrowserWindowConstructorOptions } from 'electron'
import packageJson from '../../package.json'

const __filename = fileURLToPath(import.meta.url)
const __dirname = path.dirname(__filename)

process.env.APP_ROOT = path.join(__dirname, '..')

export const VITE_DEV_SERVER_URL = process.env['VITE_DEV_SERVER_URL']
export const MAIN_DIST = path.join(process.env.APP_ROOT, 'dist-electron')
export const RENDERER_DIST = path.join(process.env.APP_ROOT, 'dist')

process.env.VITE_PUBLIC = VITE_DEV_SERVER_URL
  ? path.join(process.env.APP_ROOT, 'public')
  : RENDERER_DIST

// 设置app名称
const productName = packageJson.build.productName
app.setName(productName)
app.setAppUserModelId(productName)

export default class createWindow {
  options?: BrowserWindowConstructorOptions
  win: BrowserWindow | null
  canCloseWindow?: boolean
  isUpdating?: boolean
  id?: number

  constructor(options?: BrowserWindowConstructorOptions) {
    this.options = options
  }

  private loadURL(url: string) {
    if (VITE_DEV_SERVER_URL) {
      this.win!.loadURL(`${VITE_DEV_SERVER_URL}#/${url}`)
    } else {
      let dir = path.join(RENDERER_DIST, 'index.html')
      if (url) {
        dir = decodeURIComponent(`${dir}#/${url}`)
      }
      this.win!.loadURL(dir)
    }
  }

  // 创建主窗口
  async createMainWindow() {
    this.isUpdating = false
    this.win = new BrowserWindow({
      icon: path.join(process.env.VITE_PUBLIC ?? '', 'icon.ico'),
      width: 600,
      height: 600,
      maximizable: false,
      webPreferences: {
        preload: path.join(__dirname, 'preload.mjs'),
        devTools: true // 允许使用开发者工具
      },
      ...this.options
    })

    // 禁止ctrl + r刷新页面
    // this.win.webContents.on('before-input-event', (event, input) => {
    //   if (input.key === 'r' && input.control) {
    //     event.preventDefault() // 阻止默认行为
    //   }
    // })

    // 打开开发者工具
    // this.win.webContents.openDevTools({ mode: 'right' })
    // 隐藏菜单栏
    this.win.setMenuBarVisibility(false)
    this.loadURL('')
    // this.win.webContents.on('before-input-event', (event, input) => {
    //   if (input.key === 'F12') {
    //     event.preventDefault() // 阻止默认行为
    //     this.win!.webContents.toggleDevTools() // 切换开发者工具
    //   }
    // })

    app.on('window-all-closed', () => {
      if (process.platform !== 'darwin') {
        app.quit()
      }
    })

    // 主窗口关闭，退出程序
    this.win.on('closed', () => {
      app.quit()
    })

    // 主窗口关闭，退出程序
    this.win.on('close', (event) => {
      if (this.isUpdating) {
        return
      }
      event.preventDefault()

      hideWindow(this.win!)

      // dialog
      //   .showMessageBox(this.win!, {
      //     type: 'warning',
      //     buttons: ['Cancel', 'Yes'],
      //     title: '提示',
      //     message: '确定退出喵鼠?'
      //   })
      //   .then(({ response: choice }) => {
      //     if (choice === 1) {
      //       app.exit()
      //     }
      //   })
    })
  }
}

// 创建主窗口
export const mainWindow = new createWindow()

/**
 *  请求单一实例锁，
 *  如果该方法返回false，
 *  则表示已经有一个实例在运行，
 *  可以通过app.quit()方法退出当前实例。
 */
const gotTheLock = app.requestSingleInstanceLock()
if (!gotTheLock) {
  // 已经有一个实例在运行，退出当前实例
  app.exit()
} else {
  // 监听第二个实例被运行时
  app.on('second-instance', () => {
    // 当有第二个实例被运行时，激活之前的实例并将焦点置于其窗口
    if (mainWindow.win) {
      mainWindow.win.restore()
      showWindow(mainWindow.win)
    }
  })

  app.whenReady().then(() => {
    mainWindow.createMainWindow()

    // 系统托盘
    const tray = new Tray(path.join(process.env.VITE_PUBLIC ?? '', 'icon.ico'))
    const contextMenu = Menu.buildFromTemplate([
      {
        label: '退出',
        click: () => {
          dialog
            .showMessageBox(mainWindow.win!, {
              type: 'warning',
              buttons: ['Cancel', 'Yes'],
              title: '提示',
              message: `确定退出${productName}?`
            })
            .then(({ response: choice }) => {
              if (choice === 1) {
                app.exit()
              }
            })
        }
      }
    ])
    tray.setToolTip(productName)
    tray.setContextMenu(contextMenu)

    // 监听托盘图标的单击事件
    tray.on('click', () => {
      if (mainWindow.win) {
        showWindow(mainWindow.win)
      }
    })

    // 监听托盘图标的双击事件
    tray.on('double-click', () => {
      if (mainWindow.win) {
        showWindow(mainWindow.win)
      }
    })

    app.on('window-all-closed', () => {
      tray.destroy()
    })
  })
}

// 隐藏窗口
export const hideWindow = (win: BrowserWindow) => {
  win.hide()
  win.setSkipTaskbar(true)
}

// 显示窗口
export const showWindow = (win: BrowserWindow) => {
  win.show()
  win.setSkipTaskbar(false)
  win.restore()
}

// 设置主题
ipcMain.on('set-theme', (_, theme: 'system' | 'light' | 'dark') => {
  // 通知其他渲染进程
  nativeTheme.themeSource = theme
})
